/* GRID */

$grid-desktop-columns: 12 !default;
$grid-desktop-gutter: 16px !default;
$grid-desktop-margin: 16px !default;

$grid-desktop-breakpoint: 840px !default;

$grid-tablet-columns: 8 !default;
$grid-tablet-gutter: $grid-desktop-gutter !default;
$grid-tablet-margin: $grid-desktop-margin !default;

$grid-tablet-breakpoint: 480px !default;

$grid-phone-columns: 4 !default;
$grid-phone-gutter: $grid-desktop-gutter !default;
$grid-phone-margin: $grid-desktop-margin !default;

$grid-cell-default-columns: $grid-phone-columns !default;
$grid-max-columns: $grid-desktop-columns !default;

.mdl-grid {
  display: flex;
  flex-flow: row wrap;
  margin: 0 auto 0 auto;
  align-items: stretch;
  &.mdl-grid--no-spacing {
    padding: 0;
  }
}

.mdl-cell {
  box-sizing: border-box;
}

.mdl-cell--top {
  align-self: flex-start;
}

.mdl-cell--middle {
  align-self: center;
}

.mdl-cell--bottom {
  align-self: flex-end;
}

.mdl-cell--stretch {
  align-self: stretch;
}

.mdl-grid.mdl-grid--no-spacing > .mdl-cell {
  margin: 0;
}

// Define order override classes.
@for $i from 1 through $grid-max-columns {
  .mdl-cell--order-#{$i} {
    order: $i;
  }
}

// Mixins for width calculation.
@mixin partial-size($size, $columns, $gutter) {
  width: calc(#{$size / $columns * 100 + "%"} - #{$gutter});
  .mdl-grid--no-spacing > & {
    width: #{$size / $columns * 100 + "%"};
  }
}

@mixin full-size($gutter) {
  @include partial-size(1, 1, $gutter);
}

@mixin offset-size($size, $columns, $gutter) {
  margin-left: calc(#{$size / $columns * 100 + "%"} + #{$gutter / 2});
  .mdl-grid.mdl-grid--no-spacing > & {
    margin-left: #{$size / $columns * 100 + "%"};
  }
}

////////// Phone //////////

@media (max-width: $grid-tablet-breakpoint - 1) {
  .mdl-grid {
    padding: $grid-phone-margin - $grid-phone-gutter / 2;
  }
  .mdl-cell {
    margin: $grid-phone-gutter / 2;
    @include partial-size($grid-cell-default-columns, $grid-phone-columns, $grid-phone-gutter);
  }
  .mdl-cell--hide-phone {
    display: none !important;
  }
  // Define order override classes.
  @for $i from 1 through $grid-max-columns {
    .mdl-cell--order-#{$i}-phone.mdl-cell--order-#{$i}-phone {
      order: $i;
    }
  }
  // Define partial sizes for columnNumber < totalColumns.
  @for $i from 1 through $grid-phone-columns - 1 {
    .mdl-cell--#{$i}-col,
    .mdl-cell--#{$i}-col-phone.mdl-cell--#{$i}-col-phone {
      @include partial-size($i, $grid-phone-columns, $grid-phone-gutter);
    }
  }
  // Define 100% for everything else.
  @for $i from $grid-phone-columns through $grid-desktop-columns {
    .mdl-cell--#{$i}-col,
    .mdl-cell--#{$i}-col-phone.mdl-cell--#{$i}-col-phone {
      @include full-size($grid-phone-gutter);
    }
  }
  // Define valid phone offsets.
  @for $i from 1 through $grid-phone-columns - 1 {
    .mdl-cell--#{$i}-offset,
    .mdl-cell--#{$i}-offset-phone.mdl-cell--#{$i}-offset-phone {
      @include offset-size($i, $grid-phone-columns, $grid-phone-gutter);
    }
  }
}

////////// Tablet //////////

@media (min-width: $grid-tablet-breakpoint) and (max-width: $grid-desktop-breakpoint - 1) {
  .mdl-grid {
    padding: $grid-tablet-margin - $grid-tablet-gutter / 2;
  }
  .mdl-cell {
    margin: $grid-tablet-gutter / 2;
    @include partial-size($grid-cell-default-columns, $grid-tablet-columns, $grid-tablet-gutter);
  }
  .mdl-cell--hide-tablet {
    display: none !important;
  }
  // Define order override classes.
  @for $i from 1 through $grid-max-columns {
    .mdl-cell--order-#{$i}-tablet.mdl-cell--order-#{$i}-tablet {
      order: $i;
    }
  }
  // Define partial sizes for columnNumber < totalColumns.
  @for $i from 1 through $grid-tablet-columns - 1 {
    .mdl-cell--#{$i}-col,
    .mdl-cell--#{$i}-col-tablet.mdl-cell--#{$i}-col-tablet {
      @include partial-size($i, $grid-tablet-columns, $grid-tablet-gutter);
    }
  }
  // Define 100% for everything else.
  @for $i from $grid-tablet-columns through $grid-desktop-columns {
    .mdl-cell--#{$i}-col,
    .mdl-cell--#{$i}-col-tablet.mdl-cell--#{$i}-col-tablet {
      @include full-size($grid-tablet-gutter);
    }
  }
  // Define valid tablet offsets.
  @for $i from 1 through $grid-tablet-columns - 1 {
    .mdl-cell--#{$i}-offset,
    .mdl-cell--#{$i}-offset-tablet.mdl-cell--#{$i}-offset-tablet {
      @include offset-size($i, $grid-tablet-columns, $grid-tablet-gutter);
    }
  }
}

////////// Desktop //////////

@media (min-width: $grid-desktop-breakpoint) {
  .mdl-grid {
    padding: $grid-desktop-margin - $grid-desktop-gutter / 2;
  }
  .mdl-cell {
    margin: $grid-desktop-gutter / 2;
    @include partial-size($grid-cell-default-columns, $grid-desktop-columns, $grid-desktop-gutter);
  }
  .mdl-cell--hide-desktop {
    display: none !important;
  }
  // Define order override classes.
  @for $i from 1 through $grid-max-columns {
    .mdl-cell--order-#{$i}-desktop.mdl-cell--order-#{$i}-desktop {
      order: $i;
    }
  }
  // Define partial sizes for all numbers of columns.
  @for $i from 1 through $grid-desktop-columns {
    .mdl-cell--#{$i}-col,
    .mdl-cell--#{$i}-col-desktop.mdl-cell--#{$i}-col-desktop {
      @include partial-size($i, $grid-desktop-columns, $grid-desktop-gutter);
    }
  }
  // Define valid desktop offsets.
  @for $i from 1 through $grid-desktop-columns - 1 {
    .mdl-cell--#{$i}-offset,
    .mdl-cell--#{$i}-offset-desktop.mdl-cell--#{$i}-offset-desktop {
      @include offset-size($i, $grid-desktop-columns, $grid-desktop-gutter);
    }
  }
}
